//
//  "$Id: Mobile.h 33844 2011-08-31 07:59:46Z wang_haifeng $"
//
//  Copyright (c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	WIFI接口 API
//	Revisions:		2011-10-17  huang_zhendi  Create
//
#ifndef __WLAN_H__
#define __WLAN_H__

#include "Defs.h"
#ifdef __cplusplus
extern "C" {
#endif

typedef struct
{
	unsigned int eapstyle;				/// EAP方法 0:EAP_PEAP //1:EAP_TLS 2:EAP_TTLS
	unsigned int  authtype;				/// EAP身份验证 0:EAP_NONE 1:EAP_PAP 2:EAP_MSCHAP 3:EAP_MSCHAPV2 4:EAP_GTC
	char identity[32];						/// 身份
	char anonymous_identity[32];	/// 匿名身份
	char password[32];						/// 密码
	char ca_cert[256];						/// ca证书
	char client_cert[256];				/// 用户证书
}EapConfig;

typedef struct 
{
	int enable;
	char ssid[36];
	int linkMode;	// 0:auto 1:adhoc 2:Infrastructure
	int encryption;	// 0: off  1:on 2:WEP-OPEN 3: WEP-SHARED  
					// 4:WPA-PSK-TKIP, 5: WPA-PSK-CCMP(WPA-PSK-AES)
					// 6:WPA2-PSK-TKIP, 7:WPA2-PSK-AES
					// 8:WPA-TKIP       9:WPA-CCMP(WPA-AES)
					// 10:WPA2-TKIP     11:WPA2-AES
	int keyType;	// 0:Hex 1:ASCII
	int keyId;
	char keys[128]; 
	int keyFlag;
	EapConfig eap_config;
	int wmm_enable;         // WMM是否使能 0：不使能WMM 1:使能WMM OPTIONAL_DEFAULT_CONFIG: 默认配置值
	char bandwidthValid;    // 是否支持获取网卡带宽 0: 不支持   1: 支持          
    char reserved[3];
	int reserved[31];
} WlanConfig;


///\WlanDeviceInfo 扩展结构128个字节
typedef struct
{
    char ssid[36];  //ap ssid
    char bssid[18]; //ap mac
    unsigned char connected; //0:not ; 1:connected
    unsigned char linkMode; //0:auto 1:adhoc 2:Infrastructure
    int  rssiQuality; ///< int:dB
    unsigned int maxBitRate; ///<unit:bps;
    unsigned char authMode; //0:OPEN;1:SHARED;2:WPA;3:WPA-PSK;4:WPA2;5:WPA2-PSK;
					                            //6:WPA-NONE ;only use in Adhoc mode
					                            //mix MODE
					                            //7:WPA-PSK | WPA2-PSK; 
					                            //8:WPA | WPA2;
					                            //9:WPA | WPA-PSK;
					                            //10:WPA2 | WPA2-PSK;
					                            //11:WPA | WPA-PSK |WPA2 |WPA2-PSK
                            
    unsigned char encrAlgr; //0:NONE; 1:WEP; 2:TKIP; 3:AES(CCMP); 4 TKIP+AES( mix Mode)
    unsigned char linkQuality; //0~100; unit:percent 
    unsigned char apNetWorkType; //Reserved 0: 11b, 1: 11a, 2: 11a/n, 3: 11b/g, 4: 11b/g/n,unknown etc
    unsigned char wps;    // 1 : 支持WPS功能 0 : 不支持
    unsigned char reserved[59];  //Reserved 
} WlanDeviceInfo ;

//WPS连接类型
typedef enum 
{
	wlanPushButton, 
	wlanPinEnrollee, 
	wlanPinReg,
} WlanConnectType;

/// wlan wps配置【128字节】
typedef struct 
{
    char ssid[64];      /// AP SSID,pin码方式连接要用到，pbc方式不需要
		char apPin[8];      /// AP结点PIN码, WPS_PIN_REG方式时有效
    char wlanPin[8];    /// WIFI设备pin码; 空字符串: 由驱动产生随机PIN码并返回; 非空字符串: 用户指定PIN码
                        /// WPS_PIN_ENROLEE方式时有效     
    char bssid[6];      /// 暂时没实现。AP结点的MAC值, 全0表示任意AP结点，pbc方式时用到，
                        /// 若指定MAC值则连接指定的AP，若为0则连接按下wps按钮的AP
		WlanConnectType type;
    char reserve[36];
} WlanConfigWps;


/// 链接状态
typedef enum 
{  
	wlanDisconnect = 0,
	wlanConnect = 1,
} WlanState;		

/// Wlan 链接状态结构体【128字节】
typedef struct
{
	unsigned char state;			/// 无线连接状态  见：enum WlanState
	unsigned char pbc;				/// pbc按键是否按下，0：没有按键 1：有按键
	unsigned char module;			/// wlan 模块是否检测到 0:没有检测到模块或模块不可用; 1:检测到模块并已经准备好可以使用;
	int resv[31];
} WlanStatus;


/// 接口信息【128字节】
typedef struct WlanInterfaceInfo
{
    int index;        /// 模块编号
    char info[64]; 		/// 描述信息，设备名
    int reserve[15];
} WlanInterfaceInfo;

/// WLAN接口，128个指针
typedef struct WlanInterface
{
	/// 底层私有数据
	void *priv;

  /// 增加接口引用，createWlanInterface()时会调用，应用层不需要调用
	///
	/// \param [in] thiz 本接口指针
	/// \retval 0 成功
	/// \retval -1 失败
	int (*addRef)(struct WlanInterface *thiz);

	/// 该函数用来释放接口
	///
	/// \param [in] thiz 本接口指针
	/// \retval 0 成功
	/// \retval -1 失败
	int (*release)(struct WlanInterface *thiz);
	
	/// 该函数用来重启接口
	///
	/// \param [in] thiz 本接口指针
	/// \retval 0 成功
	/// \retval -1 失败
	int (*reset)(struct WlanInterface *thiz);
	
	
	/// 该函数用来获取移动接口状态
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] state 接口状态
	/// \retval 0 成功
	/// \retval -1: 失败
	int (*getState)(struct WlanInterface *thiz, WlanStatus *state);
	
	/// 该函数用来搜索可用的AP结点
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] aps AP结点列表。
	/// \param [in] count	AP结点接收缓存数组的大小
	/// \param [out] count 搜索到的AP结点个数
	/// \retval 0 成功
	/// \retval -1 失败
	int (*scanAps)(struct WlanInterface *thiz, WlanDeviceInfo aps[], int *count);
	
	/// 该函数用来建立WLAN链接
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] config WLAN接口配置信息，为NULL时使用默认配置信息
	/// \retval 0 成功
	/// \retval -1 失败
	int (*connect)(struct WlanInterface *thiz, WlanConfig *config);

	/// 该函数用来关闭WLAN链接
	///
	/// \param [in] thiz 本接口指针
	/// \retval 0 成功
	/// \retval -1 失败
	int (*disconnect)(struct WlanInterface *thiz);


	/// 该函数用来打开Wlan接口
	///
	/// \param [in] thiz 本接口指针
	/// \retval 0 成功
	/// \retval -1 失败
	int (*open)(struct WlanInterface *thiz);

	/// 该函数用来关闭WLAN接口
	///
	/// \param [in] thiz 本接口指针
	/// \retval 0 成功
	/// \retval -1 失败
	int (*close)(struct WlanInterface *thiz);
	
	
	/// 采用WPS方式连接。该接口只负责进行连接，至于连接成功与否不负责
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] cfg WPS连接需要的参数
	/// \retval 0 连接配置成功。是否连接成功调用接口getState检查
	/// \retval -1 失败
	int (*connectWps)(struct WlanInterface *thiz, WlanConfigWps *cfg);


    ///获取指定ssid的相关信息
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] ssid 搜索的ssid,
	/// \retval 0 成功
	/// \retval -1 失败
	int (*getSsidInfo)(struct WlanInterface *thiz, const char *ssid, WlanDeviceInfo *info);
	
	/// 该函数用来WLAN接口的默认配置
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] config  接口配置信息
	/// \retval 0 成功
	/// \retval -1 失败
	int (*getConfig)(struct WlanInterface *thiz, WlanConfig *config);

	/// 该函数用来获取网络带宽
	///
	/// \param [in] thiz 本接口指针
	/// \retval >=0 带宽，单位byte
	/// \retval -1 失败
	int (*getBandwidth)(struct WlanInterface *thiz);

	/// 保留字节
	void* reserved[112];

} WlanInterface;


/// 该函数初始化WLAN接口库资源
///
/// \retval 0 成功
/// \retval -1 失败
int PAL_API initWlanLib(void);


/// 该函数返回WLAN接口信息
///
/// \param [out] list 指向移动接口信息结构WlanInterfaceInfo的数组。
/// \param [in,out]num 输入最大个数，输出实际个数
/// \retval 0 获取成功
/// \retval -1 获取失败
int PAL_API getWlanInterfaceList(WlanInterfaceInfo* list, int *num);

/// 创建WLAN接口
///
/// \param [in] dest 移动接口描述结构WlanInterfaceInfo指针
/// \retval !=NULL 创建成功
/// \retval NULL 创建失败
WlanInterface *PAL_API createWlanInterface(WlanInterfaceInfo *desc);


#ifdef __cplusplus
}
#endif

#endif //__WLAN_H__
